#include "comm.hpp"
#include "fifo.hpp"

int main()
{
    // 1.创建共享内存的唯一标识key
    key_t key = GetShmKey();
    cout << "key=" << ToHex(key) << endl;
    //sleep(2);
    // 2.创建共享内存
    int shmid = CreatShm(key, defaultsize);
    cout << "shmid: " << shmid << endl; // shmid:0,1,2,3,4,.....
    //sleep(2);

    // ShmDsStat(shmid);
    // ShmDsSet(shmid);
    // ShmDsStat(shmid);
 
    // 4.将共享内存与进程进行关联(构建页表映射关系)
    char *addr = (char *)ShmAttach(shmid);//此空间当做字符串使用类似于malloc()
    cout << "Attach shm success, addr: " << ToHex((uint64_t)addr) << endl;
    //sleep(15);
    
    //增加协调机制
    //引入管道文件
    Fifo fifo(PATH);//构造函数会创建管道文件,析构函数移除管道文件
    Sync syn;
    syn.OpenRead();//服务端以读方式打开管道文件

    //5.建立映射关系之后,客户端与服务端可以进行进程间通信
    // 服务端从共享内存读取数据
    while(1)
    {
        //服务端先进行等待
        if(syn.Wait()!=true)
        {
            break;//服务端退出
        }
        //服务端读取共享内存中的数据
        cout<<"shm content:"<<addr<<endl;
    }

    // 6.将共享内存与进程进行去关联(消除页表映射关系)(进程退出时,页表、进程地址空间均会销毁,也可以将共享内存与进程进行去关联)
    ShmDetach(addr);
    cout << "detach shm success, addr: " << ToHex((uint64_t)addr) << endl;
    //sleep(10);  

    // 3.释放共享内存
    DeleteShm(shmid);
    return 0;
}